﻿#pragma once
#include "stdafx1.h"
#include <QList>
#include <QMap>

#include "Source/ProjectModule/Undo/ExtendPart/C_UndoDataBase.h"
#include "Point3D.h"

/*
-----==========================================================-----
		类：			场监视器 数据类.h
		作者：			杨骁
		所属模块：		场监视器模块
		功能：			场监视器模块的数据类对象
-----==========================================================-----
*/

class gp_Pnt;
class C_FieldMonitor : public C_UndoDataBase {

	public:
		C_FieldMonitor();
		~C_FieldMonitor();

	//-----------------------------------
	//----属性
	public:
		void setName(QString name);
		QString getName();

	//-----------------------------------
	//----参数
	private:
		int m_MonitorType;		// 0:E-Field  1:H-Field and Surface current  2:Farfield/RCS  3:Field source  4:monostatic RCS
		int m_SpecType;			// 0:freq  1:time
		bool m_AutoName;
		
		int m_FreqType;			// 0:Frequencies(';' separated)
		double m_Freq;
		QStringList m_Freqs;

		double m_Time_Start;
		double m_Time_End;
		double m_Time_Step;
		bool m_Time_useEndTime;
	public:
							//参数 - 从类型字符串获取类型下标
		int getMonitorTypeFromTypeStr(const QString&);
		int getSpecTypeFromTypeStr(const QString&);
							//参数 - 设置spec类型
		void setSpecType(int spec);
		int getSpecType();
							//参数 - 设置监视器类型
		void setMonitorType(int type);
		int getMonitorType();
		QString getMonitorTypeString();
							//参数 - 设置自动名称
		void setAutoNameState(bool value);
		bool getAutoNameState();

							//参数 - 频域 - 设置频率类型
		void setFreqType(int type);
		int getFreqType();
							//参数 - 频域 - 设置频率列表
		void setFreqs(QStringList freqs);
		QStringList getFreqs();
							//参数 - 频域 - 设置频率
		void setFreq(double freq);
		double getFreq();

							//参数 - 时域 - 设置起始时间
		void setTimeStart(double data);
		double getTimeStart();
							//参数 - 时域 - 设置终止时间
		void setTimeEnd(double data);
		double getTimeEnd();
							//参数 - 时域 - 设置步长
		void setTimeStep(double data);
		double getTimeStep();
							//参数 - 时域 - 设置使用终止时间
		void setUseEndTime(bool enabled);
		bool isUseEndTime();
	
	//-----------------------------------
	//----RCS
	private:
		double m_Theta;
		double m_Phi;
	public:
							//RCS - 设置Theta
		void setTheta(double value);
		double getTheta();
							//RCS - 设置Phi
		void setPhi(double value);
		double getPhi();

	//-----------------------------------
	//----切面片（3个点）
	public:
		double x1;
		double y1;
		double z1;
		double x2;
		double y2;
		double z2;
		double x3;
		double y3;
		double z3;
	public:
							//切面片 - 三点是否共线
		bool isCollinear();
							//切面片 - 根据三点算出第四个点
		DSEM::Point3D getQuadrilateralVertex();
	public:
							//切面片 - 三点是否共线
		static bool util_isCollinear(const DSEM::Point3D& p1, const DSEM::Point3D& p2, const DSEM::Point3D& p3);
							//切面片 - 根据三点算出第四个点
		static DSEM::Point3D util_getQuadrilateralVertex(const DSEM::Point3D& p1, const DSEM::Point3D& p2, const DSEM::Point3D& p3);
		
		
	//-----------------------------------
	//----描述
	public:
										//描述 - 获取属性描述
		QPair<QString, QString> getAttributesDesc();

	//-----------------------------------
	//----表面电流
	public:
										//表面电流 - 获取网格文件
		static bool genSurfaceCurrentMeshFile();

	//-----------------------------------
	//----下拉框参数
	public:
										//下拉框参数 - 获取频率
		static QStringList getFieldItems();

	//-----------------------------------
	//----访问器
	public:
												//访问器 - 获取子类类名
		QString get__CLASS_NAME__() override;
												//访问器 - 获取子类类名（中文名）
		QString get__CLASS_NAME__Chinese() override;
												//访问器 - 获取所有继承的类名
		QStringList get__CLASS_INHERITED_LIST__() override;
												//访问器 - 是否继承了某类
		bool get__CLASS_IS_INSTANCE_OF__(QString class_name) override;
												//访问器 - 原型复制对象
		C_FieldMonitor clone();
		QSharedPointer<C_FieldMonitor> clonePtr();
		C_UndoDataBasePtr cloneParentPtr() override;

	//-----------------------------------
	//----类属性
	public:
												//运算符重载
		const bool operator== (const C_FieldMonitor& a)const;
												//空判断
		bool isNull();
												//实体类 -> QJsonObject
		QJsonObject getJsonObject_undoChildData() override;
												//QJsonObject -> 实体类
		void setJsonObject_undoChildData(QJsonObject obj) override;
};
